/**
 * 文件描述：路由导航守卫
 * 拿到pinia里面的用户 token,判断是否登录
 */

// 引入路由
import router from "./index";

// 引入 Pinia 里面的用户状态
import { useUserStore } from "@/store/auth";

router.beforeEach((to) => {
  const userStore = useUserStore();

  const isLogin = userStore.token;

  if (!isLogin) {
    // 如果没有登录且访问的不是登录页面，则重定向到登录页面
    if (to.path !== "/login") {
      return { path: "/login" };
    }
  } else {
    // 如果已经登录且访问的是登录页面，则重定向到首页
    if (to.path === "/login") {
      return { path: "/" };
    }

    /**
     * 作用解释:针对需要权限的路由进行判断,首先要判断当前跳转的路由,里面有没有权限要求,如果有的话,再判断,权限要求数组里的数据跟 pinia 里存储的角色数据有没有交集
     * 如果没有交集,代表当前用户没有权限访问该路由,就跳转到首页
     *
     * to.meta.needAuth: 路由元信息中的权限要求 needAuth: ["admin", "manager"],
     * roles: pinia 里的 本地存储中的 ["admin", "manager"] 角色
     * (to.meta.needAuth as string[]) - 类型断言,一定是字符串数组
     * some() 方法用于 检查数组中是否至少有一个元素满足指定条件,它的核心特点是：只要有一个元素满足条件，立即返回 true；如果所有元素都不满足条件，则返回 false。
     */
    if (
      to.meta?.needAuth &&
      !userStore.roles.some((role: string) => {
        return (to.meta.needAuth as string[]).includes(role);
      })
    ) {
      return { path: "/" };
    }
  }
});
